/*
 * operacoes.c
 *
 *  Created on: 31/05/2011
 *      Author: fernando
 */

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "avl.h"
#include "operacoes.h"

#include "impressor.h"

int eLetra(char c) {
	if(isalpha(c)) return 1;
	return 0;
}

char minuscula(char c) {
	if(isalpha(c)) return tolower(c);
	return c;
}

void carregaTexto(char *texto, No **arvore) {
	FILE *arq;
	char word[MAXPALAVRA];
	char linha[MAXLINHA];
	Linha *l;
	Texto *tex;
	int contLinha = 1;
	int pont, i;

	arq = fopen(texto, "r");

	if(arq == NULL) {
		perror("Falha na abertura do arquivo.");
		return;
	}

	tex = novoTexto(texto);

	while(!feof(arq)) {
		fgets(linha, MAXLINHA, arq);
		l = novaLinha(contLinha, linha);
		for(i = 0; i < strlen(linha); i++) {
			pont = i;
			while(eLetra(linha[i])) {
				word[i - pont] = minuscula(linha[i]);
				i++;
			}
			word[i - pont] = '\0';

			if(strlen(word) > 0) {
				if(linha[i] == '\'' && linha[i+1] == 't') {
					strcat(word, "'t");
					i+=2;
				}
				else if(linha[i] == '\'' && linha[i+1] == 's') {
					insereAVL(word, tex, l, arvore);
					strcat(word, "'s");
					i+=2;
				}
				insereAVL(word, tex, l, arvore);
			}
		}
		contLinha++;
	}

	fclose(arq);
}

void listaPalavra(char *palavra, NoTexto **consulta, No *arvore) {
	No *p;
	NoLinha *pLin;
	NoTexto *pTex;

	inicializaNoTexto(consulta);

	p = busca(palavra, arvore);

	if(p != NULL) {
		pTex = p->textos;

		while(pTex != NULL) {
			pLin = pTex->linhas;
			while(pLin != NULL) {
				insereNoTexto(pLin->l, pTex->tex, consulta);
				pLin = pLin->prox;
			}
			pTex = pTex->prox;
		}
	}
}

NoTexto *listaConsulta(int num_mais, int num_menos, char palavrasMais[MAXPALAVRA][MAXPALAVRA], char palavrasMenos[MAXPALAVRA][MAXPALAVRA], No *arvore) {
	NoTexto *consulta, *aux;
	int i;

	if(num_mais == 0)
		return NULL;

	listaPalavra(palavrasMais[0], &consulta, arvore);

	for(i = 1; i < num_mais; i++) {
		listaPalavra(palavrasMais[i], &aux, arvore);
		intersecaoTextos(&consulta, aux);
	}

	for(i = 0; i < num_menos; i++) {
		listaPalavra(palavrasMenos[i], &aux, arvore);
		menosTextos(&consulta, aux);
	}

	removeDuplicatasTextos(&consulta);

	aux = consulta;

	while(aux != NULL) {
		if(aux->linhas == NULL)
		removeNoTexto(aux, &consulta);
		aux = aux->prox;
	}

	return consulta;
}
